﻿// 304 [CF 126B] Password.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
/*
http://oj.daimayuan.top/course/22/problem/911

给你一个字符串 s，由小写字母组成，你需要求出其中最长的一个子串 p
，满足 p 既是 s 的前缀，又是 s 的后缀，
且在 s 中以非前缀后缀的形式出现过。如果找不到输出 Just a legend。

输入一行一个字符串 s，输出一行一个字符串 p。

输入格式
一行一个字符串 s。

输出格式
输出一行一个字符串表示答案。

样例输入1
fixprefixsuffix
样例输出1
fix
样例输入2
abcdabc
样例输出2
Just a legend

abcda


abacda

abzacda

aaaaa

qkuncqjbcfdqcodhkggiqktahyfenjoqloikjerwjxhwrnzjktwwazxckvvphbsurhxbjlflkvnohuvolyljltrqaksmqnijcpjhq

数据规模
对于所有数据，保证 1≤|s|≤106，字符串均由小写字母构成。
*/

#include <iostream>
#include <cstring>
#include <vector>
#include <algorithm>


using namespace std;

const int N = 1000010, P = 131;
char str[N];
typedef unsigned long long ULL;
ULL h[N], p[N];


ULL get(int l, int r)
{
    return h[r] - h[l - 1] * p[r - l + 1];
}


int main()
{
	cin >> str + 1;
    int n = strlen(str + 1);
    p[0] = 1;
    for (int i = 1; i <= n; i++)
    {
        h[i] = h[i - 1] * P + str[i];
        p[i] = p[i - 1] * P;
    }
    vector<int> pairv;
    for (int i = 1; i < n; i++) {
        if (get(1, 1 + i - 1) == get(n - i + 1, n)) {
            pairv.push_back(i);
        }
    }

    for (int i = pairv.size() - 1; i >= 0; i--) {
        int len = pairv[i];
        for (int j = 2; j < n; j++) {
            if (j + len - 1 >= n) break;
            if (get(j, j + len - 1) == get(1, 1 + len - 1)) {
                for (int k = 1; k <= len; k++) {
                    cout << str[k];
                }
                cout << endl; return 0;
            }
        }
    }

    cout << "Just a legend" << endl;


	return 0;
}
 